package com.sisgesbyte.web.managedBean.ventas;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

import com.sisgesbyte.common.ConstModVentas;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.ClienteListaResponse;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.administracion.MantenimientoCategoriaCliente;
import com.sisgesbyte.services.administracion.bean.CategoriaClienteBean;
import com.sisgesbyte.services.administracion.bean.CategoriaClienteListaRes;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.comun.MantenTipoIdentificacion;
import com.sisgesbyte.services.comun.bean.ListaTipoIdentificacionResponse;
import com.sisgesbyte.services.comun.bean.TipoIdentificacionBean;
import com.sisgesbyte.services.localizacion.MantenimientoCiudad;
import com.sisgesbyte.services.localizacion.MantenimientoDistrito;
import com.sisgesbyte.services.localizacion.MantenimientoDivision;
import com.sisgesbyte.services.localizacion.MantenimientoPais;
import com.sisgesbyte.services.localizacion.bean.CiudadBean;
import com.sisgesbyte.services.localizacion.bean.DistritoBean;
import com.sisgesbyte.services.localizacion.bean.DivisionBean;
import com.sisgesbyte.services.localizacion.bean.ListaCiudadResponse;
import com.sisgesbyte.services.localizacion.bean.ListaDistritoResponse;
import com.sisgesbyte.services.localizacion.bean.ListaDivisionResponse;
import com.sisgesbyte.services.localizacion.bean.ListaPaisesResponse;
import com.sisgesbyte.services.localizacion.bean.PaisBean;
import com.sisgesbyte.services.ventas.MantenimientoCliente;
import com.sisgesbyte.services.ventas.bean.ClienteBean;
import com.sisgesbyte.services.ventas.bean.ClienteBeanRequest;
import com.sisgesbyte.services.ventas.bean.ClienteDatosGeneralesBean;
import com.sisgesbyte.services.ventas.bean.ClienteLocalesBean;
import com.sisgesbyte.services.ventas.bean.ListaClienteLocalesRes;
import com.sisgesbyte.web.managedBean.common.MantenimientoAbstract;
import com.sisgesbyte.web.managedBean.seguridad.OpcionesControlador;

@ManagedBean
@ViewScoped
public class ClientesMBean extends MantenimientoAbstract implements
		Serializable {

	private static final long serialVersionUID = 1L;

	@EJB
	private MantenimientoCliente mantenimientoCliente;
	@EJB
	private MantenTipoIdentificacion mantenTipoIdentificacion;
	@EJB
	private MantenimientoCategoriaCliente mantenimientoCategoriaCliente;
	@EJB
	private MantenimientoPais mantenimientoPais;
	@EJB
	private MantenimientoDivision mantenimientoDivision;
	@EJB
	private MantenimientoCiudad mantenimientoCiudad;
	@EJB
	private MantenimientoDistrito mantenimientoDistrito;

	@Inject
	private Validaciones validaciones;
	@ManagedProperty(value = "#{opcionesControlador}")
	private OpcionesControlador opcionesControlador;
	private FiltrosSQLBean cadenaFiltros;
	private List<ClienteBean> listaClientes;
	private List<ClienteBean> selectedCliente;
	private List<CategoriaClienteBean> listaCategoriaCliente;
	private List<ClienteLocalesBean> listaLocalesCliente;
	private List<ClienteLocalesBean> listaTemporalLocalesCliente;
	private List<ClienteLocalesBean> modificarLocalesCliente;
	private ClienteLocalesBean selectedLocalesCliente;
	private List<TipoIdentificacionBean> listaTipoIdentificacion;
	private List<PaisBean> listaPaises;
	private List<DivisionBean> listaDivision;
	private List<CiudadBean> listaCiudades;
	private List<DistritoBean> listaDistritos;
	private String tipoMantenimiento;
	private String saved;
	private String txtBuscar;
	private int codigoPais;
	private Boolean buttomActivar;
	private Boolean inputPersonaNatural;
	private Boolean inputJuridica;
	//public List<ClienteLocalesBean> modificar;

	@PostConstruct
	private void init() {
		saved = "";
		tipoMantenimiento = "";
		txtBuscar = "";
		codigoPais = Integer.valueOf(ConstantesInternasSistema.CODIGO_PAIS);
		listaTemporalLocalesCliente = new ArrayList<ClienteLocalesBean>();
		buttomActivar = true;
		inputPersonaNatural= true;
		inputJuridica = true;
		nuevoFormCliente();
		crearFiltro();
		cargarTipoIdentificacion();
		cargarCategoriaCliente();
		cargarPais();
		cargarDivisionPais();
		cargarCiudades();
		cargarDistritos();
		inicializar();
	}

	public Validaciones getValidaciones() {
		return validaciones;
	}

	public void setValidaciones(Validaciones validaciones) {
		this.validaciones = validaciones;
	}

	public OpcionesControlador getOpcionesControlador() {
		return opcionesControlador;
	}

	public void setOpcionesControlador(OpcionesControlador opcionesControlador) {
		this.opcionesControlador = opcionesControlador;
	}

	public FiltrosSQLBean getCadenaFiltros() {
		return cadenaFiltros;
	}

	public void setCadenaFiltros(FiltrosSQLBean cadenaFiltros) {
		this.cadenaFiltros = cadenaFiltros;
	}

	public Boolean getButtomActivar() {
		return buttomActivar;
	}

	public void setButtomActivar(Boolean buttomActivar) {
		this.buttomActivar = buttomActivar;
	}

	public String getTipoMantenimiento() {
		return tipoMantenimiento;
	}

	public void setTipoMantenimiento(String tipoMantenimiento) {
		this.tipoMantenimiento = tipoMantenimiento;
	}

	public String getSaved() {
		return saved;
	}

	public void setSaved(String saved) {
		this.saved = saved;
	}

	public String getTxtBuscar() {
		return txtBuscar;
	}

	public void setTxtBuscar(String txtBuscar) {
		this.txtBuscar = txtBuscar;
	}

	public List<ClienteBean> getListaClientes() {
		return listaClientes;
	}

	public void setListaClientes(List<ClienteBean> listaClientes) {
		this.listaClientes = listaClientes;
	}

	public List<ClienteBean> getSelectedCliente() {
		return selectedCliente;
	}

	public void setSelectedCliente(List<ClienteBean> selectedCliente) {
		this.selectedCliente = selectedCliente;
	}

	public List<ClienteLocalesBean> getListaLocalesCliente() {
		return listaLocalesCliente;
	}

	public void setListaLocalesCliente(
			List<ClienteLocalesBean> listaLocalesCliente) {
		this.listaLocalesCliente = listaLocalesCliente;
	}

	public ClienteLocalesBean getSelectedLocalesCliente() {
		return selectedLocalesCliente;
	}

	public void setSelectedLocalesCliente(
			ClienteLocalesBean selectedLocalesCliente) {
		this.selectedLocalesCliente = selectedLocalesCliente;
	}

	public List<TipoIdentificacionBean> getListaTipoIdentificacion() {
		return listaTipoIdentificacion;
	}

	public void setListaTipoIdentificacion(
			List<TipoIdentificacionBean> listaTipoIdentificacion) {
		this.listaTipoIdentificacion = listaTipoIdentificacion;
	}

	public List<CategoriaClienteBean> getListaCategoriaCliente() {
		return listaCategoriaCliente;
	}

	public void setListaCategoriaCliente(
			List<CategoriaClienteBean> listaCategoriaCliente) {
		this.listaCategoriaCliente = listaCategoriaCliente;
	}

	public List<PaisBean> getListaPaises() {
		return listaPaises;
	}

	public void setListaPaises(List<PaisBean> listaPaises) {
		this.listaPaises = listaPaises;
	}

	public List<DivisionBean> getListaDivision() {
		return listaDivision;
	}

	public void setListaDivision(List<DivisionBean> listaDivision) {
		this.listaDivision = listaDivision;
	}

	public List<CiudadBean> getListaCiudades() {
		return listaCiudades;
	}

	public void setListaCiudades(List<CiudadBean> listaCiudades) {
		this.listaCiudades = listaCiudades;
	}

	public List<DistritoBean> getListaDistritos() {
		return listaDistritos;
	}

	public void setListaDistritos(List<DistritoBean> listaDistritos) {
		this.listaDistritos = listaDistritos;
	}

	public int getCodigoPais() {
		return codigoPais;
	}

	public void setCodigoPais(int codigoPais) {
		this.codigoPais = codigoPais;
	}
	
	public Boolean getInputPersonaNatural() {
		return inputPersonaNatural;
	}

	public void setInputPersonaNatural(Boolean inputPersonaNatural) {
		this.inputPersonaNatural = inputPersonaNatural;
	}

	public Boolean getInputJuridica() {
		return inputJuridica;
	}

	public void setInputJuridica(Boolean inputJuridica) {
		this.inputJuridica = inputJuridica;
	}

	public List<ClienteLocalesBean> getModificarLocalesCliente() {
		return modificarLocalesCliente;
	}

	public void setModificarLocalesCliente(
			List<ClienteLocalesBean> modificarLocalesCliente) {
		this.modificarLocalesCliente = modificarLocalesCliente;
	}
	public List<ClienteLocalesBean> getListaTemporalLocalesCliente() {
		return listaTemporalLocalesCliente;
	}
	public void setListaTemporalLocalesCliente(
			List<ClienteLocalesBean> listaTemporalLocalesCliente) {
		this.listaTemporalLocalesCliente = listaTemporalLocalesCliente;
	}

	@Override
	public void inicializar() {
		try {
			ClienteListaResponse response = mantenimientoCliente.listarClientes(ObtenerIdTransaccion(), cadenaFiltros);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				this.listaClientes = response.getListaClientes();
				this.listaTemporalLocalesCliente.clear();
			} else {
				System.out.println("No se encontro Data "
						+ response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error al cargar Lista " + e);
		}
	}

	public void mostrarLocales() {
		//limpiamos la variable temporal
		this.listaTemporalLocalesCliente.clear();
		try {
			int idLocalNew = 0;
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			List<Object> valores = new ArrayList<>();
			List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
			FiltrosBean listaCampo1 = new FiltrosBean();
			List<String> campo1 = new ArrayList<String>();
			campo1.add("cl.cliente_id");
			listaCampo1.setCampos(campo1);
			listaCampo1.setOperador("=");
			filtro.add(listaCampo1);
			for (ClienteBean bean : selectedCliente) {
				idLocalNew = bean.getIdCliente();
			}
			System.out.println("idLocal = " + idLocalNew);
			valores.add(idLocalNew);
			filtroSQL.setListaFiltros(filtro);
			filtroSQL.setListaValores(valores);

			ListaClienteLocalesRes response = mantenimientoCliente.listaClienteLocales(ObtenerIdTransaccion(), filtroSQL);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				this.listaLocalesCliente = response.getListaLocalesCliente();
			} else {
				System.out.println("No se encontro Data " + response.getMensajeRespuesta());
			}
		} catch (Exception e) {

		}
	}

	public void cargarTipoIdentificacion() {
		try {
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			ListaTipoIdentificacionResponse response = mantenTipoIdentificacion
					.listaTipoIdentificacion(ObtenerIdTransaccion(), filtroSQL);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				this.listaTipoIdentificacion = response
						.getListaTipoIdentificacion();
			} else {
				System.out.println("No se encontro Data "
						+ response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error al cargar Lista " + e);
		}
	}

	public void cargarCategoriaCliente() {
		try {
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			CategoriaClienteListaRes response = mantenimientoCategoriaCliente
					.listaCategoriaCliente(ObtenerIdTransaccion(), filtroSQL);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				this.listaCategoriaCliente = response
						.getListaCategoriaCliente();
			} else {
				System.out.println("No se encontro Data "
						+ response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error al cargar Lista " + e);
		}
	}

	public void cargarPais() {
		try {
			ListaPaisesResponse response = mantenimientoPais
					.listarPaises(ObtenerIdTransaccion());
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				this.listaPaises = response.getListaPaises();
			} else {
				System.out.println("No se encontro Data "
						+ response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error al cargar Lista " + e);
		}
	}

	public void cargarDivisionPais() {
		try {
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			List<Object> valores = new ArrayList<>();
			List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
			FiltrosBean listaCampo1 = new FiltrosBean();
			List<String> campo1 = new ArrayList<String>();
			campo1.add("dp.pais_id");
			listaCampo1.setCampos(campo1);
			listaCampo1.setOperador("=");
			filtro.add(listaCampo1);
			valores.add(Integer.valueOf(ConstantesInternasSistema.CODIGO_PAIS));
			filtroSQL.setListaFiltros(filtro);
			filtroSQL.setListaValores(valores);
			filtroSQL.setCampoOrden("p.nombre");
			filtroSQL.setTipoOrden("asc");

			ListaDivisionResponse response = mantenimientoDivision
					.listarDivision(ObtenerIdTransaccion(), filtroSQL);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				this.listaDivision = response.getListaDivision();
			} else {
				System.out.println("No se encontro Data "
						+ response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error al cargar Lista  " + e);
		}
	}

	public void cargarCiudades() {
		FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
		int idDepartamento = 0;
		try {
			if (selectedLocalesCliente != null) {
				try{
					idDepartamento = selectedLocalesCliente.getIdDepartamento();
				}catch(Exception e){
					idDepartamento=0;
				}
			}
			if (idDepartamento > 0) {
				List<Object> valores = new ArrayList<>();
				List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
				FiltrosBean listaCampo1 = new FiltrosBean();
				List<String> campo1 = new ArrayList<String>();
				campo1.add("c.division_pais_id");
				listaCampo1.setCampos(campo1);
				listaCampo1.setOperador("=");
				filtro.add(listaCampo1);
				valores.add(idDepartamento);
				filtroSQL.setListaFiltros(filtro);
				filtroSQL.setListaValores(valores);
				filtroSQL.setCampoOrden("c.nombre");
				filtroSQL.setTipoOrden("asc");
			} else {
				filtroSQL.setCampoOrden("c.nombre");
				filtroSQL.setTipoOrden("asc");
			}
			
			ListaCiudadResponse response = mantenimientoCiudad.listarCiudades( ObtenerIdTransaccion(), filtroSQL);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				this.listaCiudades = response.getListaCiudades();
			} else {
				System.out.println("No se encontro Data " + response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out
					.println("Ocurrio un error al cargar Lista Ciudades " + e);
		}
	}

	public void cargarDistritos() {

		FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
		int idCiudad = 0;

		try {
			if (selectedLocalesCliente != null) {
				try{
					idCiudad = selectedLocalesCliente.getIdCiudad();
				}catch(Exception e){
					idCiudad = 0;
				}
			}

			if (idCiudad > 0) {

				List<Object> valores = new ArrayList<>();
				List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
				FiltrosBean listaCampo1 = new FiltrosBean();
				List<String> campo1 = new ArrayList<String>();
				campo1.add("d.ciudad_id");
				listaCampo1.setCampos(campo1);
				listaCampo1.setOperador("=");
				filtro.add(listaCampo1);
				valores.add(idCiudad);
				filtroSQL.setListaFiltros(filtro);
				filtroSQL.setListaValores(valores);
				filtroSQL.setCampoOrden("d.nombre");
				filtroSQL.setTipoOrden("asc");
			} else {
				filtroSQL.setCampoOrden("d.nombre");
				filtroSQL.setTipoOrden("asc");
			}

			ListaDistritoResponse response = mantenimientoDistrito.listarDistritos(ObtenerIdTransaccion(), filtroSQL);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				this.listaDistritos = response.getListaDistritos();
			} else {
				System.out.println("No se encontro Data " + response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error al cargar Lista Distritos" + e);
		}
	}

	public void nuevoFormCliente() {

		ClienteLocalesBean nuevo = new ClienteLocalesBean();
		nuevo.setActive(false);
		this.selectedLocalesCliente = nuevo;

	}

	public void activarInputxTipoDoc(){
		setInputJuridica(true);
		setInputPersonaNatural(true);
		for(ClienteBean cl : selectedCliente){
			if(cl.getTipoIdentificacionId() == Integer.valueOf(ConstModVentas.TIPO_DOC_JURIDICO)){
				setInputJuridica(false);
			}
			if(cl.getTipoIdentificacionId() == Integer.valueOf(ConstModVentas.TIPO_DOC_PERSONA)){
				setInputPersonaNatural(false);
			}
		}
	}
	
	public void seleccionarLocal(SelectEvent event) {
		// activamos los botones Modificar y Eliminar
		setButtomActivar(false);
		setSelectedLocalesCliente((ClienteLocalesBean) event.getObject());
	}

	@Override
	public void unSelect(UnselectEvent event) {
		selectedCliente.remove((ClienteBean) event.getObject());
		opcionesControlador.habilitarControles(selectedCliente.size());
	}

	@Override
	public void checkSelect(SelectEvent event) {
		List<ClienteBean> selected = new ArrayList<ClienteBean>();
		selected.add((ClienteBean) event.getObject());
		setSelectedCliente(selected);
		setSaved("");
		mostrarLocales();
		opcionesControlador.habilitarControles(selectedCliente.size());
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void seleccionarItem(SelectEvent event) {
		List<ClienteBean> selected = new ArrayList<ClienteBean>();
		selected.add((ClienteBean) event.getObject());
		setSelectedCliente(selected);
		setSaved("");
		mostrarLocales();
		opcionesControlador.habilitarControles(selectedCliente.size());
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void dobleSelect(SelectEvent event) {
		List<ClienteBean> selected = new ArrayList<ClienteBean>();
		selected.add((ClienteBean) event.getObject());
		setSelectedCliente(selected);
		setSaved("");
		mostrarLocales();
		opcionesControlador.habilitarControles(selectedCliente.size());
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void nuevoItem() {
		setSaved("");
		limpiarFormulario();
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO);
	}

	@Override
	public void editItem() {
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void updateInsertItem() {
		if (tipoMantenimiento
				.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO)) {
			guardarItem();
		}
		if (tipoMantenimiento
				.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE)) {
			modificarItem();
		}
	}

	@Override
	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext()
				.getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}

	// agregar locales en temporal
	public void agregarLocal() {

		String txtciudad = "";
		String txtdistrito = "";
		// buscamos los nombres de ciudad y distrito ya que solo se obtiene el
		// ID al seleccionar
		System.out.println("Id ciudad : " + getSelectedLocalesCliente().getIdCiudad());
		for (CiudadBean ciudad : listaCiudades) {
			if (ciudad.getCodigo() == selectedLocalesCliente.getIdCiudad()) {
				txtciudad = ciudad.getCiudad();
				break;
			}
		}
		for (DistritoBean distrito : listaDistritos) {
			if (distrito.getId() == selectedLocalesCliente.getIdDistrito()) {
				txtdistrito = distrito.getDistrito();
				break;
			}
		}
		// Seteamos los valores del selectedLocalCliente para agregarlo a
		// temporal
		getSelectedLocalesCliente().setCiudad(txtciudad);
		getSelectedLocalesCliente().setDistrito(txtdistrito);
		getSelectedLocalesCliente().setCrud("add");
		if( this.listaLocalesCliente != null && this.listaLocalesCliente.size() > 0){
			// Agregamos el ID del local para que no salga el error en el selected
			// de la tabla, ya que es necesario que tenga el ID
			getSelectedLocalesCliente().setIdLocal( this.listaLocalesCliente.get( this.listaLocalesCliente.size() - 1).getIdLocal() + 1);
		}else{
			//inizializamos la lista de locales si se encuentra vacio para evitar el error del null
			List<ClienteLocalesBean> lista = new ArrayList<ClienteLocalesBean>();
			this.listaLocalesCliente=lista;
			//Agregamos el ID para evitar el error de selected
			getSelectedLocalesCliente().setIdLocal(1);
		}
		this.listaLocalesCliente.add(getSelectedLocalesCliente());
		this.listaTemporalLocalesCliente.add(getSelectedLocalesCliente());
		nuevoLocal();
	}

	public void modificarLocal() {

		for (ClienteLocalesBean local : listaLocalesCliente) {
			
			if (local.getIdLocal() == getSelectedLocalesCliente().getIdLocal()) {
				// seteamos los valores del local seleccionado
				ClienteLocalesBean capturaLocal = new ClienteLocalesBean();
				//para poder eliminar de la lista y asignar a una nueva
				capturaLocal = local;
				//eliminamos de la lista
				this.listaLocalesCliente.remove(local);
				capturaLocal.setIdPais(getSelectedLocalesCliente().getIdPais());
				capturaLocal.setIdDepartamento(getSelectedLocalesCliente().getIdDepartamento());
				capturaLocal.setIdCiudad(getSelectedLocalesCliente().getIdCiudad());
				capturaLocal.setIdDistrito(getSelectedLocalesCliente().getIdDistrito());
				capturaLocal.setDireccion(getSelectedLocalesCliente().getDireccion());
				capturaLocal.setEmail(getSelectedLocalesCliente().getEmail());
				capturaLocal.setTelefono1(getSelectedLocalesCliente().getTelefono1());
				capturaLocal.setPrincipal(getSelectedLocalesCliente().getPrincipal());
				capturaLocal.setActive(getSelectedLocalesCliente().getActive());
				String txtciudad = "";
				String txtdistrito = "";
				// buscamos los nombres de ciudad y distrito ya que solo se obtiene el
				// ID al seleccionar
				System.out.println("Id ciudad : " + getSelectedLocalesCliente().getIdCiudad());
				for (CiudadBean ciudad : listaCiudades) {
					if (ciudad.getCodigo() == selectedLocalesCliente.getIdCiudad()) {
						txtciudad = ciudad.getCiudad();
						break;
					}
				}
				for (DistritoBean distrito : listaDistritos) {
					if (distrito.getId() == selectedLocalesCliente.getIdDistrito()) {
						txtdistrito = distrito.getDistrito();
						break;
					}
				}
				capturaLocal.setCiudad(txtciudad);
				capturaLocal.setDistrito(txtdistrito);
				
				if(capturaLocal.getCodLocal() !=null && capturaLocal.getCodLocal().length()>0){
					//Si entra esta validacion es porque este local ya esta asignado a cliente
					//y seiginifica que solo sera una modificacion
					System.out.println("Modificacion ");
					capturaLocal.setClienteId(getSelectedLocalesCliente().getClienteId());
					capturaLocal.setComunObjetoId(getSelectedLocalesCliente().getComunObjetoId());
					capturaLocal.setCrud("update");
				}else{
					System.out.println("Agregar");
					capturaLocal.setCrud("add");
				}
				this.listaLocalesCliente.add(capturaLocal);
				//eliminamos el seleccionado
				this.listaTemporalLocalesCliente.remove(getSelectedLocalesCliente());
				//agregamos el modificado
				this.listaTemporalLocalesCliente.add(capturaLocal);
				break;
			}
		}
	}

	public void eliminarLocal() {
		for (ClienteLocalesBean local : listaLocalesCliente) {
			if (local.getIdLocal() == getSelectedLocalesCliente().getIdLocal()) {
				if(local.getCodLocal() !=null && local.getCodLocal().length()>0){
					local.setCrud("delete");
					this.listaTemporalLocalesCliente.add(local);
				}else{
					this.listaTemporalLocalesCliente.remove(local);
				}
				this.listaLocalesCliente.remove(getSelectedLocalesCliente());
				break;
			}
		}
		nuevoLocal();
	}

	public void nuevoLocal() {
		nuevoFormCliente();
		setButtomActivar(true);
	}

	@Override
	public void guardarItem() {
		GenericResponse response = null;
		try {
			ClienteBeanRequest cliente = new ClienteBeanRequest();
			// recolectamos los datos generales del cliente
			for (ClienteBean ls : selectedCliente) {
				ClienteDatosGeneralesBean datosGenerales = new ClienteDatosGeneralesBean();
				datosGenerales.setActiveCliente(ls.getActiveCliente());
				datosGenerales.setApellido(ls.getApellido());
				datosGenerales.setFechaNacimiento(ls.getFechaNacimiento());
				datosGenerales.setIdCategoriaCliente(ls.getCategoriaClienteId());
				datosGenerales.setIdTipoIdentificacion(ls.getTipoIdentificacionId());
				datosGenerales.setNombre(ls.getNombre());
				datosGenerales.setNumDoc(ls.getNumDoc());
				datosGenerales.setRazonSocial(ls.getRazonSocial());
				cliente.setDatosGeneralesBean(datosGenerales);
			}
			// recolectamos los locales registrados
			//generamos un local si no se ingresa manualmente
			if(listaLocalesCliente== null || listaLocalesCliente.size()==0){
				System.out.println(" - Crea un local");
				 List<ClienteLocalesBean> listaLocalNuevo = new ArrayList<ClienteLocalesBean>();
				 ClienteLocalesBean nuevo = new ClienteLocalesBean();
				 nuevo.setActive(true);
				 nuevo.setPrincipal(true);
				 nuevo.setCrud("add");
				 listaLocalNuevo.add(nuevo);
				 this.listaLocalesCliente=listaLocalNuevo;
				 this.listaTemporalLocalesCliente=listaLocalNuevo;
			}
			cliente.setListaLocales(this.listaTemporalLocalesCliente);

			GenericResponse nuevoCliente = mantenimientoCliente.nuevoCliente( ObtenerIdTransaccion(), cliente);

			if (nuevoCliente.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {

				setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
				System.out.println("Se registro Correctamente");
			} else {
				setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
				System.out.println("Hubo un error al Registrar "
						+ nuevoCliente.getCodigoRespuesta() + " - "
						+ nuevoCliente.getMensajeRespuesta());
			}

			limpiarFormulario();
			inicializar();

		} catch (Exception e) {
			setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void modificarItem() {
		GenericResponse response = null;
		try {
			ClienteBeanRequest cliente = new ClienteBeanRequest();
			// recolectamos los datos generales del cliente
			for (ClienteBean ls : selectedCliente) {
				ClienteDatosGeneralesBean datosGenerales = new ClienteDatosGeneralesBean();
				datosGenerales.setIdCliente(ls.getIdCliente());
				datosGenerales.setIdComunObjeto(ls.getIdObjetoCliente());
				datosGenerales.setActiveCliente(ls.getActiveCliente());
				datosGenerales.setApellido(ls.getApellido());
				datosGenerales.setFechaNacimiento(ls.getFechaNacimiento());
				datosGenerales.setIdCategoriaCliente(ls.getCategoriaClienteId());
				datosGenerales.setIdTipoIdentificacion(ls.getTipoIdentificacionId());
				datosGenerales.setNombre(ls.getNombre());
				datosGenerales.setNumDoc(ls.getNumDoc());
				datosGenerales.setRazonSocial(ls.getRazonSocial());
				cliente.setDatosGeneralesBean(datosGenerales);
			}
			// recolectamos los locales registrados
			cliente.setListaLocales(this.listaTemporalLocalesCliente);

			GenericResponse editarCliente = mantenimientoCliente.editarCliente( ObtenerIdTransaccion(), cliente);

			if (editarCliente.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {

				setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
				System.out.println("Se Edito Correctamente");
			} else {
				setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
				System.out.println("Hubo un error al Modificar "
						+ editarCliente.getCodigoRespuesta() + " - "
						+ editarCliente.getMensajeRespuesta());
			}

			//limpiarFormulario();
			inicializar();

		} catch (Exception e) {
			setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void eliminarItem() {
		GenericResponse response = null;
		try {
			ClienteBeanRequest cliente = new ClienteBeanRequest();
			// recolectamos los datos generales del cliente
			System.out.println("// recolectamos los datos generales del cliente");
			
			for (ClienteBean ls : selectedCliente) {
				ClienteDatosGeneralesBean datosGenerales = new ClienteDatosGeneralesBean();
				datosGenerales.setIdCliente(ls.getIdCliente());
				cliente.setDatosGeneralesBean(datosGenerales);
			}
			// recolectamos los locales registrados
			List<ClienteLocalesBean> lista = new ArrayList<ClienteLocalesBean>();
			for(ClienteLocalesBean locales :this.listaLocalesCliente){
				locales.setCrud("delete");
				lista.add(locales);
			}
			cliente.setListaLocales(lista);
			GenericResponse editarCliente = mantenimientoCliente.deleteCliente( ObtenerIdTransaccion(), cliente);

			if (editarCliente.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {
				setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
				System.out.println("Se elimino Correctamente");
			} else {
				setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
				System.out.println("Hubo un error al Eliminar "
						+ editarCliente.getCodigoRespuesta() + " - "
						+ editarCliente.getMensajeRespuesta());
			}
			inicializar();
		} catch (Exception e) {
			setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void actualizarEstado() {
		GenericResponse response = null;
		try {
			for (ClienteBean bean : listaSeleccionados(listaClientes)) {
				
			}
			inicializar();
		} catch (Exception e) {
			System.out.println("Hubo un error al actualizar el estado");
		}
	}

	@Override
	public void limpiarFormulario() {
		List<ClienteBean> listaBean = new ArrayList<ClienteBean>();
		ClienteBean bean = new ClienteBean();
		bean.setApellido("");
		listaBean.add(bean);
		mostrarLocales();// limpiamos la tabla locales
		setSelectedCliente(listaBean);
		ClienteLocalesBean nuevoLocal = new ClienteLocalesBean();
		nuevoLocal.setActive(false);
		setSelectedLocalesCliente(nuevoLocal);
		mostrarLocales();
	}

	@Override
	public void crearFiltro() {
		FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
		List<Object> valores = new ArrayList<>();
		List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
		try {
			// filtro para "cl.principal=true " -> se obtiene todos los clientes
			// con locales principales
			FiltrosBean listaCampo1 = new FiltrosBean();
			List<String> campo1 = new ArrayList<String>();
			campo1.add("cl.principal");
			listaCampo1.setCampos(campo1);
			listaCampo1.setOperador("=");
			filtro.add(listaCampo1);
			valores.add(true);
			// fin de filtro

			if (getTxtBuscar() != null
					&& getTxtBuscar().toString().length() > 0) {
				FiltrosBean listaCampo = new FiltrosBean();
				List<String> campo = new ArrayList<String>();
				campo.add("c.id");
				campo.add("cc.categoria");
				campo.add("c.cod_cliente");
				campo.add("ti.descripcion");
				campo.add("co.num_doc");
				campo.add("co.razon_social");
				campo.add("co.apellido");
				listaCampo.setCampos(campo);
				listaCampo.setOperador("like");
				filtro.add(listaCampo);
				valores.add("%" + getTxtBuscar() + "%");
			}

			filtroSQL.setCampoOrden("c.id");
			filtroSQL.setTipoOrden("desc");
			filtroSQL.setListaFiltros(filtro);
			filtroSQL.setListaValores(valores);
			setCadenaFiltros(filtroSQL);
			inicializar();
			opcionesControlador.habilitarControles(0);
		} catch (Exception e) {
			System.out.println("Error al crear filtro " + e);
			// filtro para "cl.principal=true " -> se obtiene todos los clientes
			// con locales principales
			FiltrosBean listaCampo1 = new FiltrosBean();
			List<String> campo1 = new ArrayList<String>();
			campo1.add("cl.principal");
			listaCampo1.setCampos(campo1);
			listaCampo1.setOperador("=");
			filtro.add(listaCampo1);
			valores.add(true);
			// fin de filtro
			filtroSQL.setCampoOrden("c.id");
			filtroSQL.setTipoOrden("desc");
		}
	}

	/*
	 * Metodo para recorrer y validar los tipos de campos seleccionados
	 */
	public List<ClienteBean> listaSeleccionados(List<ClienteBean> listaRequest) {
		List<ClienteBean> response = new ArrayList<ClienteBean>();
		for (ClienteBean row : listaRequest) {
			ClienteBean bean = new ClienteBean();
			bean.setActiveCliente(row.getActiveCliente());
			bean.setApellido(validaciones.validarCamposString(row.getApellido()));
			bean.setCategoriaCliente(validaciones.validarCamposString(row
					.getCategoriaCliente()));
			bean.setCategoriaClienteId(row.getCategoriaClienteId());
			bean.setCiudad(validaciones.validarCamposString(row.getCiudad()));
			bean.setCiudadId(row.getCiudadId());
			bean.setCodCliente(validaciones.validarCamposString(row
					.getCodCliente()));
			bean.setCodLocal(validaciones.validarCamposString(row.getCodLocal()));
			bean.setDistrito(validaciones.validarCamposString(row.getDistrito()));
			bean.setDistritoId(row.getDistritoId());
			bean.setDivisionPais(validaciones.validarCamposString(row
					.getDivisionPais()));
			bean.setDivisionPaisId(row.getDivisionPaisId());
			bean.setFechaNacimiento(row.getFechaNacimiento());
			bean.setIdCliente(row.getIdCliente());
			bean.setIdClienteLocal(row.getIdClienteLocal());
			bean.setIdObjetoCliente(row.getIdObjetoCliente());
			bean.setLocalActivo(row.getLocalActivo());
			bean.setLocalPrincipal(row.getLocalPrincipal());
			bean.setNombre(validaciones.validarCamposString(row.getNombre()));
			bean.setNumDoc(validaciones.validarCamposString(row.getNumDoc()));
			bean.setPais(validaciones.validarCamposString(row.getPais()));
			bean.setPaisId(row.getPaisId());
			bean.setRazonSocial(validaciones.validarCamposString(row
					.getRazonSocial()));
			bean.setTipoIdentificacion(validaciones.validarCamposString(row
					.getTipoIdentificacion()));
			bean.setTipoIdentificacionId(row.getTipoIdentificacionId());

			response.add(bean);
		}
		return response;
	}

}
